home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1995-11-30 | 3.5 KB | 102 lines | [TEXT/.Ob4] |
- Syntax10.Scn.Fnt
- Syntax10i.Scn.Fnt
- StampElems
- Alloc
- 30 Nov 95
- Syntax10b.Scn.Fnt
- MODULE Bitmaps;
- (* MK 1994-05-09 *) (* MAH
- for PowerMac *)
- (* Thanks to G
- nther Blaschek, Michael Franz, Matthias Hausner *)
- IMPORT Sys, SYSTEM, Display, Macintosh;
- Bitmap* = POINTER TO BitmapDesc;
- BitmapDesc* = RECORD
- w-, h-: LONGINT; (* wide and height of Bitmap *)
- p: Sys.CGrafPort;
- adr: POINTER TO ARRAY OF CHAR
- END;
- Disp-: Bitmap; (* Bitmap representing the screen *)
- PROCEDURE ToRect(VAR r1: Sys.Rect; x, y, w, h: INTEGER);
- BEGIN
- r1.left := x;
- r1.right := x + w;
- r1.bottom := y;
- r1.top := y - h
- END ToRect;
- PROCEDURE CopyBlock* (sb, db: Bitmap; sx, sy, w, h, dx, dy, mode: INTEGER);
- (* copies a part of the source-Bitmap sb to the destination-Bitmap db *)
- r1, r2: Sys.Rect;
- s, d : Sys.PixMapRealPtr;
- hdis, hdes, hsrc : Sys.PixMapRealHandle;
- BEGIN
- Sys.HLock (db.p.portPixMap);
- Sys.HLock (sb.p.portPixMap);
- Sys.HLock (Disp.p.portPixMap);
- hdes:=SYSTEM.VAL (Sys.PixMapRealHandle, db.p.portPixMap);
- hsrc:=SYSTEM.VAL (Sys.PixMapRealHandle, sb.p.portPixMap);
- hdis:=SYSTEM.VAL (Sys.PixMapRealHandle, Disp.p.portPixMap);
- IF hdes.p = hdis.p THEN
- Macintosh.SetPenScreen(TRUE, Macintosh.thePortClip, Display.white, mode)
- END;
- ToRect (r1, sx, SHORT (sb.h) -sy, w, h);
- ToRect (r2, dx, SHORT (db.h) -dy, w, h);
- s:=SYSTEM.VAL (Sys.PixMapRealPtr, hsrc.p);
- d:=SYSTEM.VAL (Sys.PixMapRealPtr, hdes.p);
- Sys.CopyBits2 (s^, d^, r1, r2, mode, 0);
- (* releasing the memory of source-Bitmap, if source-Bitmap is not representing the screen *)
- IF hsrc.p # hdis.p THEN
- (* Sys.DeAllocBlock (s.baseAddr); *)
- Sys.CloseCPort (sb.p)
- END;
- Sys.HUnlock (db.p.portPixMap);
- Sys.HUnlock (sb.p.portPixMap);
- Sys.HUnlock (Disp.p.portPixMap);
- END CopyBlock;
- PROCEDURE New* (w, h: LONGINT): Bitmap;
- (* allocates a new Bitmap, which could be used from an Oberon-Programm *)
- b: Bitmap;
- rb: INTEGER;
- p : Sys.PixMapRealPtr;
- hand : Sys.PixMapRealHandle;
- BEGIN
- (* allocating new Bitmap *)
- NEW (b);
- b.w := w;
- b.h := h;
- Sys.OpenCPort (b.p);
- Sys.HLock (b.p.portPixMap);
- hand:=SYSTEM.VAL (Sys.PixMapRealHandle, b.p.portPixMap);
- p:=SYSTEM.VAL (Sys.PixMapRealPtr, hand.p);
- ToRect (p.bounds, 0, SHORT (h), SHORT (w), SHORT (h));
- (* calculating of rowBytes must be even, should be a multiple of four *)
- rb := ((p.pixelSize * SHORT (w)) + 15) DIV 16 * 2;
- p.rowBytes := MIN (INTEGER) + rb;
- (* allocating space for image *)
- (* Sys.AllocBlock (adr, rb * h); *)
- SYSTEM.NEW (b.adr, rb * h);
- p.baseAddr := SYSTEM.VAL (LONGINT, b.adr);
- Sys.HUnlock (b.p.portPixMap);
- ASSERT (b.adr#NIL);
- (* returning new Bitmap *)
- RETURN b
- END New;
- PROCEDURE Init*;
- VAR p : Sys.PixMapRealPtr; hand : Sys.PixMapRealHandle;
- BEGIN
- Display.SetColor (12, 210, 210, 210);
- Display.SetColor (13, 150, 150, 150);
- Display.SetColor (14, 100, 100, 100);
- (* allocating a new Bitmap, which represents the screen *)
- NEW (Disp);
- Sys.OpenCPort (Disp.p);
- Sys.HLock (Disp.p.portPixMap);
- hand:=SYSTEM.VAL (Sys.PixMapRealHandle, Disp.p.portPixMap);
- p:=SYSTEM.VAL (Sys.PixMapRealPtr, hand.p);
- Disp.h := p.bounds.bottom - p.bounds.top;
- Disp.w := p.bounds.right - p.bounds.left;
- Sys.HUnlock (Disp.p.portPixMap);
- END Init;
- BEGIN Init
- END Bitmaps.
-